package org.iamd.domain.business;

import org.iamd.domain.IWorker;
import org.iamd.domain.data.IData;
import org.iamd.domain.data.IDataAccess;
import org.iamd.util.CommonMsgKeys;

/**
 * Основен бизнес обект на Системата.
 * 
 * @author И. Атанасов
 * 
 * @param <L>
 *            Data Access Object за работа с value обекти.
 */
public abstract class BusinessWorker<L extends IDataAccess<? extends IData, ? extends Object>>
		implements IWorker {

	/** Data Access Object за работа с value обекти. */
	private L dao;

	/**
	 * Стандартен конструктор. Инициализира Logger-а и dao-то за работа със съответното репозитори.
	 * 
	 * @throws ApplicationException
	 *             при неуспешно инстанциране
	 */
	protected BusinessWorker() throws ApplicationException {
		initialize();
	}

	/**
	 * Синхронизира сесията и връща текущото DAO
	 * 
	 * @return текущия Data Access Object
	 */
	protected final L getDAO() {
		return this.dao;
	}

	/**
	 * @return класа на Data Access обекта
	 */
	protected abstract Class<L> getDAOClass();

	/**
	 * Инициализира обектите на класа.
	 * 
	 * @throws ApplicationException
	 *             при неуспешна инициализация
	 */
	protected void initialize() throws ApplicationException {
		Class<L> daoClass = getDAOClass();
		if (daoClass != null) {
			try {
				this.dao = daoClass.newInstance();
			} catch (Exception e) {
				throw new ApplicationException(CommonMsgKeys.M0003_DAO_INIT_FAILED,
						new Object[] { daoClass.getName() }, e);
			}
		}
	}

}